package com.ruoyi.receipt.domain;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;

/**
 * 自定义拦截器
 */
@Slf4j
@Component
public class AuthInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        AuthAnn authority = method.getAnnotation(AuthAnn.class);
        //获取注解里面的默认值 这里是admin
        String value = authority.value();
        //这里可以根据枚举数组里面的信息对数据权限进行更细粒度的处理
        AuthEnum[] authEnums = authority.authType();
        if (authority == null) {
            // 如果注解为null, 说明不需要拦截, 直接放过
            return true;
        }
        // 这里为了方便直接传递了参数
        // 一般的做法是用户第一次登录，将信息放到session中
        // 以后每次操作时从request中获取session，从session中获取用户信息
        // 然后根据用户信息从数据库中查权限信息
        String userAuthority = request.getParameter("userAuthority");
        //判断是否是admin 不是的话返回没有权限 这里可以自己定义一个权限查询sql传过去拼接
        if (!userAuthority.equals(value)) {
            // 脱离了Spring MVC的返回流程，重新编码
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json;charset=UTF-8");
            PrintWriter out = null;
            try {
                out = response.getWriter();
            } catch (IOException e) {
                e.printStackTrace();
            }
            out.print("没有权限");
            out.flush();
            out.close();
            return false;
        }
        return true;
    }
}
